package demo2

import "fmt"

// TestDemo25 数组
func TestDemo25() {
	// demo1 -- 三个整数的数组
	var a [3]int

	// 通过 索引 访问员
	fmt.Println(a[0])
	fmt.Println(a[len(a)-1])

	// 遍历1 -- 打印索引和元素, 通过 range a 遍历
	for i, v := range a {
		fmt.Printf("%d %d\n", i, v)
	}

	// 遍历2 -- 打印元素
	for _, v := range a {
		fmt.Printf("%d\n", v)
	}

	// demo2 -- 数组的初始化
	var q = [3]int{1, 2, 3}
	var r = [3]int{1, 2}
	// var q [3]int = [3]int{1, 2, 3}
	// var r [3]int = [3]int{1, 2}
	fmt.Println(q[2]) // 3
	fmt.Println(r[2]) // 0,  初始值

	// 如果在数组的长度位置出现的是“...”省略号，则表示数组的长度是根据初始化值的个数来计算
	q2 := [...]int{1, 2, 3}
	fmt.Printf("%T\n", q2) // 3[int]

	// 初始化的使用
	type Currentcy int
	const (
		USD Currentcy = iota // 美元
		EUR                  // 欧元
		GBP                  // 英镑
		RMB                  // 人民币
	)

	symbol := [...]string{USD: "$", EUR: "€", GBP: "￡", RMB: "￥"}

	fmt.Println(RMB, symbol[RMB]) // "3￥"

	// 数组初始化，省略掉无用的索引 -- 声明一个 length=100 的数组
	r2 := [...]int{99: 1}

	fmt.Printf("r2 length is %d", len(r))
	fmt.Printf("r2 0 %d", r2[0])
	fmt.Printf("r2 99 %d", r2[99])

	// demo3 -- 数组的比较
	/* 比较两个数组
	   1. 如果一个数组的元素类型是可以相互比较的，那么数组类型也是可以相互比较的，
	   2. 这时候我们可以直接通过 == 比较运算符来比较两个数组，只有当两个数组的所有元素都是相等的时候数组才是相等的。
	   3. 不相等比较运算符 != 遵循同样的规则。
	*/
	a1 := [2]int{1, 2}
	b1 := [...]int{1, 2}
	c1 := [2]int{1, 3}

	fmt.Println(a1 == b1, a1 == c1, b1 == c1) // true false false
	// d := [3]int{1, 2}

	// a1 类型是 [2]int, d 类型是 [3]int， 无法比较
	// fmt.Println(a1 == d)

	// demo4 -- 遍历数组
	var team [3]string
	team[0] = "hammer"
	team[1] = "soldier"
	team[2] = "mum"

	for k, v := range team {
		fmt.Println(k, v)
	}
}
